export default class SDIntervalTimer {
	private intervalId : number | null = null;  // 定时器 ID
	private startTime : number = 0;             // 开始时间
	private remaining : number;                 // 剩余时间
	private isPaused : boolean = false;         // 是否暂停
	private callback : () => void;              // 每次定时器执行时的回调函数
	private delay : number;                     // 每隔多长时间执行一次

	constructor(callback : () => void, delay : number) {
		this.remaining = delay;                  // 初始化剩余时间
		this.delay = delay;                      // 保存延迟时间
		this.callback = callback;                // 回调函数
	}

	// 开始或继续定时器
	start() {
		if (this.isPaused) {
			// 如果已经暂停，则用剩余时间启动一次性定时器
			this.isPaused = false;
			this.resumeInterval();
		} else {
			// 如果没有暂停，则是第一次启动
			this.startInterval();
		}
	}

	// 暂停定时器
	pause() {
		if (this.intervalId !== null) {
			clearInterval(this.intervalId);        // 清除当前的间隔定时器
			this.remaining -= Date.now() - this.startTime; // 计算剩余时间
			this.isPaused = true;                  // 标记为暂停状态
			this.intervalId = null;
		}
	}

	// 停止并重置定时器
	stop() {
		if (this.intervalId !== null) {
			clearInterval(this.intervalId);        // 清除定时器
			this.intervalId = null;
		}
		this.isPaused = false;
		this.remaining = this.delay;              // 重置为初始时间
	}

	// 内部方法：启动定时器
	private startInterval() {
		this.startTime = Date.now();             // 记录开始时间
		this.intervalId = setInterval(() => {
			this.callback();                     // 执行回调函数
		}, this.delay);                          // 使用完整的 delay 时间间隔
	}

	// 内部方法：继续执行定时器（用于暂停后继续）
	private resumeInterval() {
		this.startTime = Date.now();             // 记录开始时间
		// 使用剩余时间启动一次性定时器
		setTimeout(() => {
			this.callback();                     // 执行一次回调
			// 再开始正常的定时调度
			this.startInterval();
		}, this.remaining);                      // 使用剩余时间
		this.intervalId = null;
	}
}